package com.smart.community.complaint.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.smart.community.complaint.entity.Complaint;
import com.smart.community.complaint.vo.ComplaintVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 投诉建议数据访问层接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-06-26
 */
@Mapper
public interface ComplaintMapper extends BaseMapper<Complaint> {

    /**
     * 分页查询投诉建议列表
     * 
     * @param page 分页参数
     * @param userId 用户ID（可选）
     * @param communityId 社区ID（可选）
     * @param title 投诉标题（模糊查询）
     * @param categoryCode 投诉分类编码（可选）
     * @param status 投诉状态（可选）
     * @param urgency 紧急程度（可选）
     * @param handlerId 处理人ID（可选）
     * @param isAnonymous 是否匿名投诉（可选）
     * @param satisfactionRate 满意度评分（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param sortField 排序字段
     * @param sortOrder 排序方向
     * @return 分页结果
     */
    IPage<ComplaintVO> selectComplaintPage(
            Page<ComplaintVO> page,
            @Param("userId") Long userId,
            @Param("communityId") Long communityId,
            @Param("title") String title,
            @Param("categoryCode") String categoryCode,
            @Param("status") Integer status,
            @Param("urgency") Integer urgency,
            @Param("handlerId") Long handlerId,
            @Param("isAnonymous") Boolean isAnonymous,
            @Param("satisfactionRate") Integer satisfactionRate,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("sortField") String sortField,
            @Param("sortOrder") String sortOrder
    );

    /**
     * 根据用户ID查询投诉列表
     * 
     * @param userId 用户ID
     * @return 投诉列表
     */
    List<ComplaintVO> selectComplaintsByUserId(@Param("userId") Long userId);

    /**
     * 根据投诉ID查询投诉详情
     * 
     * @param complaintId 投诉ID
     * @return 投诉详情
     */
    ComplaintVO selectComplaintDetail(@Param("complaintId") Long complaintId);

    /**
     * 查询超时投诉列表
     * 
     * @return 超时投诉列表
     */
    List<ComplaintVO> selectTimeoutComplaints();

    /**
     * 查询待回访投诉列表
     * 
     * @return 待回访投诉列表
     */
    List<ComplaintVO> selectPendingFollowupComplaints();

    /**
     * 获取投诉统计信息
     * 
     * @param communityId 社区ID
     * @return 统计信息
     */
    Map<String, Object> selectComplaintStatistics(@Param("communityId") Long communityId);

    /**
     * 根据投诉编号查询投诉
     * 
     * @param complaintNo 投诉编号
     * @return 投诉信息
     */
    Complaint selectByComplaintNo(@Param("complaintNo") String complaintNo);

    /**
     * 检查投诉编号是否存在
     * 
     * @param complaintNo 投诉编号
     * @return 是否存在
     */
    int countByComplaintNo(@Param("complaintNo") String complaintNo);

    /**
     * 根据社区ID查询投诉数量
     * 
     * @param communityId 社区ID
     * @return 投诉数量
     */
    int countByCommunityId(@Param("communityId") Long communityId);

    /**
     * 根据处理人ID查询投诉数量
     * 
     * @param handlerId 处理人ID
     * @return 投诉数量
     */
    int countByHandlerId(@Param("handlerId") Long handlerId);

    /**
     * 根据状态查询投诉数量
     * 
     * @param status 状态
     * @return 投诉数量
     */
    int countByStatus(@Param("status") Integer status);

    /**
     * 根据紧急程度查询投诉数量
     * 
     * @param urgency 紧急程度
     * @return 投诉数量
     */
    int countByUrgency(@Param("urgency") Integer urgency);

    /**
     * 批量删除投诉
     * 
     * @param complaintIds 投诉ID列表
     * @return 删除数量
     */
    int deleteBatchByIds(@Param("complaintIds") List<Long> complaintIds);

    /**
     * 批量更新投诉状态
     * 
     * @param complaintIds 投诉ID列表
     * @param status 状态
     * @return 更新数量
     */
    int updateBatchStatus(@Param("complaintIds") List<Long> complaintIds, @Param("status") Integer status);

    /**
     * 批量分配处理人
     * 
     * @param complaintIds 投诉ID列表
     * @param handlerId 处理人ID
     * @return 更新数量
     */
    int updateBatchHandler(@Param("complaintIds") List<Long> complaintIds, @Param("handlerId") Long handlerId);
}
